Climate change is a phenomenon that is rapidly increasing health risks around the globe, but especially in developing nations. Many countries still rely on small-scale decentralized healthcare systems that heavily depend on the availability of healthcare personnel, and they likely do not have contingency plans in place if a crisis were to arise. These fragile systems are most susceptible to breaking down in the face of climate disaster. For our project, we wanted to examine climate-change-induced health impacts from around the globe, specifically focusing on vulnerability across time, regions of the world, and specific indicators of risk. To explore this data spatially, visit the Shiny Interactive Map.
This health vulnerability data comes from the Notre Dame Global Adaptation Dataset, with information about climate change impacts on the health sector from the time period of 1995 to 2020. This dataset covers 192 countries recognized by the UN, and scores the countries’ vulnerability from 0 to 1 (0 being the lowest vulnerability, and 1 being the highest vulnerability). This total vulnerability score is based on numerous factors, including projected change of deaths from climate change-induced diseases, access to improved sanitation facilities, and number of medical staff.
For a general sense of trends in over 25 years, this first visualization displays vulnerability over time in different regions of the world. There are six continents which include Africa, Asia, Europe, Oceania, South America, and North America. We created this data by using the top five countries with the most population in all of those countries. Choosing countries with the highest population would be more logical due to the fact that those countries represent the majority of the region. By generalizing each country’s vulnerability by population, we were able to gain a snapshot of trends for each region. Small populations in certain regions may be more or less affected by climate change and would not be included in some subsets of our regions, but we controlled this factor by including some countries even with a population less than 500,000 in that region. Specifically, Africa was represented by the Democratic Republic of Congo, Nigeria, Ethiopia, Egypt, and South Africa. Asia was represented by China, India, Indonesia, Pakistan, and Bangladesh. Europe was represented by Russia, Germany, United Kingdom, France, and Italy. Oceania was represented by Australia, Papua New Guinea, New Zealand, Fiji, and Solomon Islands. South America was represented by Brazil, Colombia, Argentina, Peru, and Venezuela. Lastly, North America is represented by the United States, Mexico, Canada, Guatemala, and Cuba.
While examining this dataset and creating visualizations for this project, we made some observations. For starters, some continents have a more consistent vulnerability score compared to others. There are continents like South America and Asia who carry consistent scores over the years, while there are continents like Oceania, and Africa that have countries that aren’t as consistent with the rest. Although we can’t be certain regarding why they aren’t as consistent, we can make the assumption that it is due to the environmental characteristics of those countries (For example, some of those countries being islands which can be affected by the ocean rising due to climate change.) We also observed that the more economically stable regions and countries have a lower score, and once again although we can’t be certain why that is, we can assume that it is because they have the economic ability to afford more sanitized facilities, health care workers, and more efficient ways to combat climate change-induced diseases.
Since 1995, we’ve seen some countries gradually decrease in vulnerability, stay stagnant, or even increase in vulnerability. To focus on the countries still at high risk in this decade, we’ll hone in on a few specific indicators of vulnerability for all countries: Projected increase in climate-change induced deaths, sanitation accessibility, and medical staff availability.
The projected percentage increase in climate-change induced deaths is a comprehensive assessment of the effects of climate change on overall health impacts. This risk indicator is the estimated percent increase of quality-adjusted loss of life years, also known as DALYs (Disability adjusted life years), projected from the historical baseline of 2000 to 2030, under conditions from current climate change emission scenarios. With GDP used as a measure of development, projected risk is mapped along with population to assess countries with the highest loss. The countries with the top 10 highest populations are labeled, to give an idea of the spread of risk across the largest proportion of the global population. From the graph, we see that countries most at risk are in red, and largely skewed towards the low GDP end of the spectrum. Low GDP is correlated with higher projected increase of climate-change induced deaths. Countries with both large population bubbles and high percentages have the highest number of people at risk.
An important consideration to make from including population data is that due to the size of high population countries, they’ll face a larger number of deaths, proportionate to the same risk percentage. For example, though they have comparable projected percentages, the US will face a higher number of projected deaths than Finland due to the differences in the sizes of population.
You’ll notice that the lowest projected percentage of death still begins at at least 1%, a sobering reminder that climate change impacts will be felt by everyone, no matter the country. A small difference in percentage points played out over the next decade will result in scores of unnecessary loss of life, and these pains will be felt the most by the countries most vulnerable.
For detailed data on the percentage risk of each country, take a look at this table.
Spatially distributing the data gives us some information about how geography plays into increased death risk. Many of the most vulnerable countries are located in the global south and near the equator, often in geographical areas most at risk for extreme weather events or environmental challenges due to climate change.
Sanitation is an important indicator of a country’s capacity to control infectious diseases. Sufficient sanitation is measured as the percentage of people in that country with access to clean sanitation facilities that can effectively prevent human, animal, and insect contact with excreta. Access to sanitation is crucial to build up preparedness to various natural disasters exacerbated by climate change, as climate effects lead to rise in infectious diseases. Looking at the spatial distribution, we notice that many developed countries have close to 90% accessibility, but many developed countries also have surprisingly low percentages, like France or Canada. This is a clue that some populations within those regions may have poor accessibility to sanitation, and are most at risk to climate events, even if the developed parts of the country have low vulnerability overall. We also see a lot of missing data for countries in Sub-Saharan Africa and in the Central area of Eurasia, an indicator that the sanitation accessibility there is poorly reported on and likely poorly maintained, and not resilient systems that could withstand climate disasters.
The proportion of medical staff in a country is an important indicator of health outcomes and resilience to climate-change induced crises. Globally, the number of doctors, midwives, and nurses has decreased by over 6.7 people per 1000 from 1995 to 2020. The growth of medical staff has not has not kept pace with the growing population, especially as the world population has increased by over a third since 1995.
We see an overall trend of medical personnel decreasing across all countries, even those low on the general vulnerability side of the scale. It appears that vulnerability does not have high correlation with decrease in medical staff, but the decrease in staff may be a factor that affects vulnerable countries the most. Lack of access to health personnel is a known obstacle to ensuring good health outcomes in times of disease outbreak or health disasters, especially in poorer countries. The number of medical professionals per capita in a country is only one part of the healthcare equation– in developed countries, factors like advanced medical technologies and organized healthcare administration can expand the reach of existing health personnel. However, that is not the case in developing countries, who may rely on dispersed systems of healthcare, unreliable supply chains, and inconsistent accessibility of care. Though the proportion of medical staff may not tell us as much about the state of healthcare in low-risk countries, it’s a strong indicator of future risks for health outcomes in underdeveloped countries– places that are much more susceptible to climate-change induced strain. The decrease of the global medical staff ratio overall calls us to examine the resiliency of our existing healthcare systems. As the world faces increasingly severe climate impacts, we have to consider what a decrease of medical staff means for the populations who are most vulnerable.
From this data, we gather that over time, countries have had high variation in terms of whether they have trended upwards or downwards in vulnerability- some countries have improved in their vulnerability scores over time, while others have remained stagnant. GDP and development scores are highly correlated with vulnerability, and geographic location also plays a role. The countries most vulnerable are in the global south, compounded by multiple levels of vulnerability: high risk of disease spread due to lacking sanitation facilities, high risk of extreme weather events or environmental challenges due to geographic location, and low existing resources and GDP to adapt against those sudden climate disasters.
When it comes to tackling global issues as large and all-encompassing as climate change, narrowing down on its myriad effects feels like an impossible gambit, but honing in on the most vulnerable countries and the reasons for that vulnerability can help us find specific, measurable ways to mitigate those risks. There are multiple dimensions to examining the impact of global climate change. Even focusing within the health sector, there are many interwoven factors that exacerbate and compound upon each other to make specific populations most vulnerable. There is no one-size fits all solution to addressing health vulnerability globally, but analyzing geospatial country data can be one tool in our toolkit to manage the humanitarian effects of a rapidly changing climate. When we think about ways to examine and tackle global issues like climate change, we can use specific indicators and to identify the regions with most high risk, the specific reasons contributing to that vulnerability, and from there, develop specific, nuanced strategies to tackle those risks.
#Code for Vulnerability Over Time Graph
health_vul <- read_csv("./resources/vulnerability/health.csv")
## Rows: 192 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): ISO3, Name
## dbl (26): 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
health_vul <- health_vul %>%
pivot_longer(3:28, names_to="year", values_to="vun")
#Mutating names so they fit in the visualizations
Continent2.0 <- health_vul %>%
mutate(Name = if_else(Name == "Congo, the Democratic Republic o", "DR Congo", Name)) %>%
mutate(Name = if_else(Name == "Russian Federation", "Russia", Name)) %>%
mutate(Name = if_else(Name == "United Kingdom", "U.K", Name)) %>%
mutate(Name = if_else(Name == "Papua New Guinea", "P.N.G", Name)) %>%
mutate(Name = if_else(Name == "Venezuela, Bolivarian Republic o", "Venezuela", Name)) %>%
filter(Name%in%c("China","India", "Indonesia", "Pakistan", "Bangladesh","Russia","Germany", "U.K", "France", "Italy","Nigeria","Ethiopia", "Egypt", "DR Congo", "South Africa","United States","Mexico", "Canada", "Guatemala", "Cuba","Australia","P.N.G", "New Zealand", "Fiji", "Solomon Islands","Brazil","Colombia", "Argentina", "Peru", "Venezuela")) %>%
mutate(Continent =
case_when(
Name%in%c("Brazil","Colombia", "Argentina", "Peru", "Venezuela") ~
"South America",
Name%in%c("Australia","P.N.G", "New Zealand", "Fiji", "Solomon Islands") ~ "Oceania",
Name%in%c("United States","Mexico", "Canada", "Guatemala", "Cuba") ~ "North America",
Name%in%c("Russia","Germany", "U.K", "France", "Italy") ~ "Europe",
Name%in%c("Nigeria","Ethiopia", "Egypt", "DR Congo", "South Africa") ~ "Africa",
Name%in%c("China","India", "Indonesia", "Pakistan", "Bangladesh") ~ "Asia"))
#Creating the actual visualization + adding aesthetics
p <- (Continent2.0 %>%
ggplot(aes(x = year, y = vun, color = Continent, group = Name,text = paste0('Name: ',Name,'\n','Year: ',year,'\nVulnerability: ',round(vun,2))))+
geom_line()+
scale_color_viridis_d(option='turbo') +
#scale_color_manual(values = cbp1)+
theme_classic()+
theme(axis.text.x = element_text(angle = 45, hjust=1))+
labs( y = "vulnerability",color = 'Continent') +
theme(panel.background = element_rect(fill = "white", color = "white"), legend.background = element_rect(fill = "white")) +
theme(plot.background = element_rect(fill = "white", color = "light grey"), plot.margin = margin(15, 2, 2, 2, "pt"),)+
theme(plot.title = element_text(face = "bold")))
p %>%
ggplotly(tooltip = c('text')) %>%
layout(title = list(text = paste0("Global Health Vulnerability ","<br><sup>","Showing the change over time in different countires","</sup>")))
#Code for Vulnerability Over Time Graph, Faceted
Continent2.0$year <- as.numeric(as.character(Continent2.0$year))
p_facet <- (Continent2.0 %>%
ggplot(aes(x = year, y = vun, color = Continent, group = Name,text = paste0('Name: ',Name,'\n','Year: ',year,'\nVulnerability: ',round(vun,2))))+
geom_line()+
scale_color_viridis_d(option='turbo') +
#scale_color_manual(values = cbp1)+
theme_classic()+
theme(axis.text.x = element_text(angle = 45, hjust=1))+
labs( y = "vulnerability",color = 'Continent') +
theme(panel.background = element_rect(fill = "white", color = "white"), legend.background = element_rect(fill = "white")) +
theme(plot.background = element_rect(fill = "white", color = "light grey"), plot.margin = margin(15, 2, 2, 2, "pt"),)+
theme(plot.title = element_text(face = "bold"))) +
theme(axis.title.x = element_text(margin = margin(t = 8))) + facet_wrap(~Continent)
p_facet %>%
ggplotly(tooltip = c('text')) %>%
layout(title = list(text = paste0("Global Health Vulnerability by Continent")))
Importing Data:
#Importing datasets
id_health_medstaff <- read_csv("resources/indicators/id_heal_04/input.csv")
## Rows: 192 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): ISO3, Name
## dbl (26): 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
gdp <- read_csv("resources/indicators/gdp/score.csv")
## Rows: 192 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): ISO3, Name
## dbl (26): 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
pop <- read_csv("resources/indicators/pop/input.csv")
## Rows: 192 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): ISO3, Name
## dbl (26): 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#projected percent increase in climate-change induced deaths
projecteddeath_perc <- read_csv("resources/indicators/id_heal_01/input.csv")
## Rows: 192 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): ISO3, Name
## dbl (26): 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
projecteddeath_perc <- read_csv("resources/indicators/id_heal_01/input.csv")
## Rows: 192 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): ISO3, Name
## dbl (26): 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
sanitationall <- read_csv("resources/indicators/id_heal_06/input.csv")
## Rows: 192 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): ISO3, Name
## dbl (26): 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
vulhealth <- read_csv("resources/vulnerability/health.csv")
## Rows: 192 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): ISO3, Name
## dbl (26): 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Selecting only 2020 data
pop2020 <- pop%>%
select(ISO3, Name, "2020") %>%
rename("pop2020" = "2020")
gdp2020 <- gdp %>%
select(ISO3, Name, "2020") %>%
rename("gdp2020" = "2020")
medstaff2020 <- id_health_medstaff %>%
rename("medstaff2020" = "2020") %>%
select(ISO3,Name,medstaff2020)
projecteddeathperc2020 <- projecteddeath_perc %>%
select(ISO3, Name, "2020") %>%
rename("projecteddeathperc2020" = "2020")
sanitation2020 <- sanitationall %>%
select(ISO3, Name, "2020") %>%
rename("sanitation2020" = "2020")
vulhealth2020 <- vulhealth %>%
select(ISO3, Name, "2020") %>%
rename("vulhealth2020" = "2020")
#Joining data
data2020 <- pop2020 %>%
left_join(gdp2020) %>%
left_join(vulhealth2020) %>%
left_join(medstaff2020) %>%
left_join(projecteddeathperc2020) %>%
left_join(sanitation2020)
## Joining, by = c("ISO3", "Name")
## Joining, by = c("ISO3", "Name")
## Joining, by = c("ISO3", "Name")
## Joining, by = c("ISO3", "Name")
## Joining, by = c("ISO3", "Name")
#Selecting for the top 10 countries to highlight in the chart
hipopdata2020 <- data2020 %>%
arrange(desc(pop2020)) %>%
filter(pop2020 > 126000000)
#Plotting the data
allpdp <- ggplot(data = data2020, aes(x = gdp2020)) +
geom_point(aes(x = gdp2020, y = pop2020, label = Name, color = projecteddeathperc2020, size = pop2020), alpha = .2) +
labs(title = "Projected % Increase in Climate-Change Induced Deaths", x = "GDP 2020 ($)", y = "Population 2020", color = "Projected Climate-change \nInduced Death % Increase") + guides(size="none") + scale_colour_gradient(low = 'blue', high = 'red') + theme_bw() + scale_y_continuous(limits = c(0, 1450000000), breaks=seq(0, 2000000000, by = 100000000), labels = scales::label_number_si()) +
scale_x_continuous(limits = c(0, 70000), breaks=seq(0, 70000, by = 10000), labels = scales::label_number_si()) + geom_text(data=hipopdata2020, aes(x = gdp2020, y = pop2020, label = Name, color = projecteddeathperc2020), size=2.6)
## Warning in geom_point(aes(x = gdp2020, y = pop2020, label = Name, color =
## projecteddeathperc2020, : Ignoring unknown aesthetics: label
ggplotly(allpdp)
#Plotting a version with percentage on the y axis, visually grouping countries by similar percentages
allpdp2 <- ggplot(data = data2020, aes(x = gdp2020)) +
geom_point(aes(x = gdp2020, y = projecteddeathperc2020, label = Name, color = projecteddeathperc2020, size = pop2020), alpha = .2) +
labs(title = "Projected % Increase in Climate-Change Induced Deaths", x = "GDP 2020 ($)", y = "Projected Climate-change Induced Death % Increase", color = "%") + guides(size="none") + scale_colour_gradient(low = 'blue', high = 'red') + theme_bw() + scale_y_continuous(limits = c(1, 1.2), breaks=seq(1, 1.2, by = .02)) +
scale_x_continuous(limits = c(0, 70000), breaks=seq(0, 70000, by = 10000), labels = scales::label_number_si())
## Warning in geom_point(aes(x = gdp2020, y = projecteddeathperc2020, label =
## Name, : Ignoring unknown aesthetics: label
ggplotly(allpdp2)
#Getting map country polygons from rnaturalearth package and matching codes
library(rnaturalearth)
map <- ne_countries()
names(map)[names(map) == "iso_a3"] <- "ISO3"
names(map)[names(map) == "name"] <- "NAME"
map$projecteddeathperc2020 <- data2020$projecteddeathperc2020[match(map$ISO3,data2020$ISO3)]
#Creating palette
pal <- colorBin(
palette = "magma", domain = map$projecteddeathperc2020,
bins = seq(1, max(map$projecteddeathperc2020, na.rm = TRUE) + 0, by = .01)
)
map$labels <- paste0(
"<strong> Country: </strong> ",
map$NAME, "<br/> ",
"<strong> projecteddeathperc2020: </strong> ",
map$projecteddeathperc2020, "<br/> "
) %>%
lapply(htmltools::HTML)
#Map aesthetic adjustments
leafletdata2020 <- leaflet(map) %>%
addTiles() %>%
setView(lng = 0, lat = 30, zoom = 2) %>%
addPolygons(
fillColor = ~ pal(projecteddeathperc2020),
color = "white",
weight = 2,
fillOpacity = 1,
label = ~labels,
highlight = highlightOptions(
color = "black",
bringToFront = TRUE
)
) %>%
leaflet::addLegend(
pal = pal, values = ~projecteddeathperc2020,
opacity = 0.7, title = "Projected Climate-Change </br>Induced Death Percentage </br> from 2000 to 2030"
)
leafletdata2020
#adjusting data for general vulnerability, same process for sanitation data as well
map$vulhealth2020 <- data2020$vulhealth2020[match(map$ISO3,data2020$ISO3)]
pal <- colorNumeric(
palette = "inferno", domain = map$vulhealth2020,
)
map$labels <- paste0(
"<strong> Country: </strong> ",
map$NAME, "<br/> ",
"<strong> Overall Health Vulnerability 2020: </strong> ",
map$vulhealth2020, "<br/> "
) %>%
lapply(htmltools::HTML)
leafletdata2020vul <- leaflet(map) %>%
addTiles() %>%
setView(lng = 0, lat = 30, zoom = 2) %>%
addPolygons(
fillColor = ~ pal(vulhealth2020),
color = "white",
weight = 2,
fillOpacity = 1,
label = ~labels,
highlight = highlightOptions(
color = "black",
bringToFront = TRUE
)
) %>%
leaflet::addLegend(
pal = pal, values = ~vulhealth2020,
opacity = 0.7, title = "Health Vulnerability </br> Score in 2020"
)
leafletdata2020vul
Calculationg mean medical staff over time:
#Finding mean over time for countries with data:
medstaff_change <- id_health_medstaff %>%
group_by(Name) %>%
mutate(med_percchange = .data[["2020"]] - .data[["1995"]])
#Combining with existing data2020 for exporting purposes
data2020 <- medstaff_change %>%
select("ISO3", "Name", "med_percchange") %>%
left_join(data2020)
## Joining, by = c("ISO3", "Name")
#selecting for data to be displayed
medstaff_num <- data2020 %>%
filter(!is.na(med_percchange)) %>%
filter(!med_percchange == 0) %>%
select("ISO3", "Name", "med_percchange", "gdp2020", "vulhealth2020", "medstaff2020", "pop2020", "projecteddeathperc2020") %>%
arrange(med_percchange)
#plotting data
medstaff_plot <- ggplot(data = medstaff_num, aes(x = vulhealth2020, y = med_percchange, label = Name)) +
geom_segment(aes(x = vulhealth2020, xend = vulhealth2020, y = med_percchange, yend = 0, color = med_percchange), alpha = 1, size = 2) +
geom_smooth(se = FALSE, color= "dark gray", size = .5) +
labs(title = "Change in Number of Medical Staff since 1995 to 2020",
x = "Overall Health Vulnerability score",
y = "Change in Number of Medical Staff",
color = "Staff Count Increase/Decrease") + guides(size="none") +
scale_colour_gradient2(low = 'red', high = 'light green', mid = "gray") + theme_bw() + scale_y_continuous(limits = c(-60, 60))
ggplotly(medstaff_plot)
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: label
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
## the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
## variable into a factor?
#Finding the total global decrease over time
mean(medstaff_num$med_percchange,na.rm=T)
## [1] -9.867709
Note: For the Shiny app, relevant data was written into a new csv for easier processing, so the data wrangling for it doesn’t appear in its .R file, and is documented here instead.
write.csv(data2020,"C:\\Users\\seash\\Documents\\GitHub\\DS_112_Project\\data2020.csv", row.names = FALSE)